#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;

//使用linux原生线程库
pthread_t tid1;
void *routine1(void *args)
{
    
    // while(true)
    // {
    //     cout << "i am a new thread!" << endl;
    //     sleep(1);
    // }

    // 子线程异常退出，整个进程也退出，因为他们共享进程地址空间，那么也就共享信号的三个表
    // int cnt = 10;
    // while(cnt--)
    // {
    //     cout << "i am a new thread, count down is:" << cnt << endl;
    //     // if(cnt == 4) //除0异常
    //     //     cnt = cnt / 0;
    //     sleep(1);
    // }

    int *pa = (int *)args;
    while ((*pa)--)
    {
        cout << "i am a new thread1, count down:" << *pa << endl;
        sleep(1);
    }

    int *p = new int(11);


    // 线程的退出方式
    // exit(11); 注意：exit是用来退出进程的，不能用它终止线程，否则整个进程终止
    // 第一种：return
    // return p;
    // 第二种：pthread_exit 退出调用它的线程
    //pthread_exit(p); // p是你要返回的值
    // 第三种：pthread_cancel 取消指定的线程，并不会等待线程退出，函数会立刻返回，默认情况下，线程也会立刻结束
    //pthread_cancel(tid1);
    //sleep(5);
    cout << "要退出了" << endl;

    return p; 

    // 有个问题：为什么线程返回，只关注返回值，并不像进程一样，关注退出信号
    // 因为线程异常退出，整个进程退出，由父进程获取退出信号，所以线程无法返回到等待它的地方
    // 线程的运行情况：
    // 1. 代码跑完，结果对
    // 2. 代码跑完，结果不对
    // 3. 出异常了 --- 重点 --- 多线程中，任何一个线程出现异常(div 0， 野指针), 都会导致整个进程退出！ ---- 多线程代码往往健壮性不好
    // 
}

int main()
{
   // pthread_t tid1;
    int num1 = 10;
    pthread_create(&tid1, nullptr, routine1, &num1);

    // while(true)
    // {
    //     cout << "i am a main thread!" << endl;
    //     sleep(1);
    // }

    // int cnt = 10;
    // while(cnt--)
    // {
    //     cout << "i am a main thread, count down is:" << cnt << endl;
    //     sleep(1);
    // }

    //sleep(5);xielou
    //pthread_cancel(tid1);
        
    //线程分离：pthread_detach 标记一个线程，表示线程分离，线程结束之后，资源自动释放，不需要等待
    pthread_detach(tid1);

    // 等待线程
    // 线程也需要被等待，不然会造成内存泄漏
    sleep(15);
    void* pa;
    cout << pa << endl;
    pthread_join(tid1, &pa);

    printf("return value:%p\n", pa);

    // 如果主线程退出，相当于进程退出，所有线程也都要退出
    return 0;
}